Skip to content

feat(showcase): fill missing designer examples — hooks + AI tools (+ hook designer coverage)#1863

Merged
os-zhuang merged 6 commits into
mainfrom
showcase-examples
Jun 15, 2026
Merged

feat(showcase): fill missing designer examples — hooks + AI tools (+ hook designer coverage)#1863
os-zhuang merged 6 commits into
mainfrom
showcase-examples

Conversation

@xuyushun441-sys

@xuyushun441-sys xuyushun441-sys commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

Found while testing the showcase package's metadata designers in Studio against an isolated showcase backend. Two designers had zero instances (nothing to render), plus a real designer coverage gap.

1. hook examples (0 → 3)

examples/app-showcase/src/hooks/ wired via defineStack({ hooks }):

  • showcase_normalize_task_title — beforeInsert/beforeUpdate, L2 JS body trimming the title (multi-event, mutates ctx.input).
  • showcase_audit_task_completion — afterUpdate gated by a CEL condition, async with a retryPolicy, onError: log, capabilities: [log].
  • showcase_warn_over_budget — afterUpdate on showcase_project.

Bodies use the real After-hook context (ctx.result / ctx.input — there is no ctx.record) and are guarded with typeof ctx.log === 'function' so both a fresh seed and a warm restart boot with 0 hook errors.

2. AI tool examples (0 → 2)

FindProjectTool was defined via defineTool but never imported into the config or passed to defineStack, so the tool designer was empty and the ProjectOps skill's tools: ['showcase_find_project'] reference dangled. Wired via defineStack({ tools }) and added a second object-bound tool (showcase_summarize_project_tasksobjectName + requiresConfirmation) so the designer covers both shapes; the skill now references both.

3. fix(spec) — complete hook designer coverage

The hook form's Execution section exposed async / onError / condition but omitted retryPolicy and the top-level timeout (both real HookSchema props). Added a retryPolicy composite + timeout field.

Verification (browser, isolated showcase backend)

  • Hook list 0 → 3; tool list 0 → 2.
  • Hook designer renders every property incl. the composite body editor (real JS, not [object Object]) and Execution: async / onError / Timeout / condition / Retry Policy → Max Retries / Backoff Ms.
  • Tool designer renders name/label/description/category/objectName/active/builtIn/requiresConfirmation + the parameters JSON schema as an input-params table + example LLM call.
  • Fresh DB seed + warm restart: 0 runtime errors.
  • Also verified the field-zoo object designer renders ~28 distinct field-type widgets; showcase is banner-clean.

Note (out of scope, pre-existing)

The showcase's own pnpm typecheck is already red on main (not in the CI gate): the Field.* builders type predicate params with the output type (z.infer), so the documented string shorthand for requiredWhen / visibleWhen / readonlyWhen fails tsc even though it's valid at runtime. That's a spec type-ergonomics fix (use z.input), best done separately.

🤖 Generated with Claude Code

os-zhuang and others added 3 commits June 15, 2026 09:37
The showcase had zero `hook` examples, so the Studio hook designer had
nothing to render. Add three hooks under src/hooks that together exercise the
hook surface and give Studio real metadata to display:

  • showcase_normalize_task_title — beforeInsert/beforeUpdate, L2 JS body that
    trims the task title (multi-event, mutate ctx.input).
  • showcase_audit_task_completion — afterUpdate gated by a CEL condition,
    async fire-and-forget with a retryPolicy, onError=log, capabilities=[log].
  • showcase_warn_over_budget — afterUpdate on showcase_project, condition +
    async log.

Wired via `defineStack({ hooks })`. Bodies read ctx.result/ctx.input (the real
After-hook context shape — there is no ctx.record) and are guarded so a fresh
seed runs them without throwing.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The hook form's Execution section exposed async / onError / condition but not
`retryPolicy` ({ maxRetries, backoffMs }) or the top-level `timeout`, both of
which are real HookSchema properties — so the designer could not show or edit
them. Add a `retryPolicy` composite and a `timeout` number to the Execution
section so the hook designer covers the full schema.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented Jun 15, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
spec Ready Ready Preview, Comment Jun 15, 2026 6:55am

Request Review

os-zhuang and others added 2 commits June 15, 2026 09:53
A persisted-DB restart re-fired the afterUpdate hooks during rollup recompute
and `ctx.log(...)` threw "not a function" — the `log` capability binding is not
reliably callable in the sandbox. Guard with `typeof ctx.log === 'function'`
so the audit / over-budget hooks are no-ops when logging is unavailable instead
of throwing. Verified: fresh seed and warm restart both boot with 0 hook errors.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…bound tool)

`FindProjectTool` was defined via defineTool but never imported into the config
or passed to defineStack, so the Studio tool designer showed zero instances and
the ProjectOps skill's `tools: ['showcase_find_project']` reference dangled.

Wire the tools via `defineStack({ tools })` and add a second, object-bound tool
(`showcase_summarize_project_tasks`, objectName + requiresConfirmation) so the
tool designer covers both the plain and object-scoped shapes. The skill now
references both.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions github-actions Bot added size/m and removed size/s labels Jun 15, 2026
@xuyushun441-sys xuyushun441-sys changed the title feat(showcase): hook examples + complete hook designer coverage (retryPolicy/timeout) feat(showcase): fill missing designer examples — hooks + AI tools (+ hook designer coverage) Jun 15, 2026
@os-zhuang
os-zhuang merged commit 6b6c065 into main Jun 15, 2026
13 checks passed
@os-zhuang
os-zhuang deleted the showcase-examples branch June 15, 2026 07:01
xuyushun441-sys added a commit that referenced this pull request Jun 21, 2026
…2128)

Exposes the opt-in inline quick-create the objectui record picker supports:
when no match exists, the user creates a record from the typed text via an
optimistic dataSource.create with the display field. Best for simple objects
whose only required field is the display field.

- spec: add `allowCreate` to FieldSchema (flows through Field.lookup via
  FieldInput); classify it live in the liveness ledger (objectui consumer).
- showcase: enable it on showcase_category.parent (Category requires only
  `name`, so quick-create succeeds) to demonstrate the flow end-to-end.
- test: assert allowCreate survives FieldSchema.parse.

Pairs with objectui #1863 (renderer quick-create reads allowCreate ||
allow_create).

Co-authored-by: Jack Zhuang <277994282+os-zhuang@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation protocol:data size/m tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants